import { GetToken } from '@/util';
import { permissionMap } from '../config/appconfig';
import config from '../config/appconfig';
import { RouteProps, match } from 'react-router-dom';
import { request as umirequest, history, useDispatch, dynamic } from 'umi';
import { IRoute } from './types';
let adminRoute: string[] = [];
import { RequestConfig } from 'umi';
import type { Location } from 'umi';

const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  405: '请求方法不被允许。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。',
};

const errorHandler = (error: any) => {
  const { response } = error;
  // if (response && response.status) {
  //   const errorText = codeMessage[response.status] || response.statusText;
  //   const { status, url } = response;
  //   console.log(`请求错误 ${status}: ${url}`);
  // notification.error({
  //   message: `请求错误 ${status}: ${url}`,
  //   description: errorText,
  // });
  // }

  if (!response) {
    // notification.error({
    //   description: '您的网络发生异常，无法连接服务器',
    //   message: '网络异常',
    // });
    console.log('您的网络发生异常，无法连接服务器');
  }
  throw error;
};

// 在 src/app.ts 中你可以配置一些运行时的配置项来实现部分自定义需求。

export const request: RequestConfig = {
  timeout: 1000,
  errorConfig: {},
  middlewares: [],
  // 异常处理
  errorHandler,
  requestInterceptors: [
    (url, options) => {
      // console.log('requestInterceptors', url, options);
      options.headers = {
        ...options.headers,
        token: localStorage.getItem('token') || '',
      };
      return {
        url,
        options,
      };
    },
  ],
  responseInterceptors: [
    async (response, options) => {
      console.log('responseInterceptors', response.body, options);
      return response;
    },
  ],
};

export const render = async (oldrender: Function) => {
  const res = await umirequest<{
    code: number;
    data: { admin: [string] };
    message: string;
  }>('yr/permission', {
    method: 'get',
  });

  if (res.code === 200) {
    adminRoute = res.data.admin;
    localStorage.setItem('permissionsRoutes', JSON.stringify(res.data.admin));
  } else {
    history.push('/login');
  }
  oldrender();
};

export async function patchRoutes({ routes }: { routes: IRoute[] }) {
  adminRoute.forEach(async (item) => {
    const nodeRoute = permissionMap[item];
    if (nodeRoute) {
      const {
        path,
        mate: { isMenu, icon, label },
        componentPath,
      } = permissionMap[item];
      routes[1].routes!.push({
        path,
        exact: true,
        mate: {
          isMenu,
          icon,
          label,
        },
        component: dynamic({
          loader: () =>
            /* webpackChunkName: 'layouts__MicroAppLayout' */ import(
              componentPath + '.tsx'
            ),
          // loading:  /* 加载组件*/<div>login</div>,
        }),
      });
    }
  });
}
interface IOnchange {
  routes: IRoute[];
  location: Location;
  action: string;
  isFirst: boolean;
  matchedRoutes: {
    match: match;
    route: IRoute;
  };
}

export function onRouteChange(val: IOnchange) {
  // console.log('onRouteChange', val, val.action, val.isFirst);
}
